package com.cskaoyan.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;

/**
 * @author stone
 * @date 2022/08/30 10:26
 */
@Component
public class CustomAspect {

    //所有通知的方法修饰符都写为public
    // Around通知的方法类似于InvocationHandler的invoke和MethodInterceptor的invoke
    // Around通知的返回值 作为代理对象执行方法的返回值
    public Object around(ProceedingJoinPoint joinPoint){
        System.out.println("around的前半部分");
        long start = System.currentTimeMillis();
        Object proceed = null;//执行委托类方法
        // Before通知：jointPoint.proceed执行之前的部分
        try {
            proceed = joinPoint.proceed();
            //AfterReturning通知：jointPoint.proceed执行之后的部分，catch之前的部分；proceed就是委托类方法的返回结果
            long end = System.currentTimeMillis();
            System.out.println("around的后半部分");
            System.out.println("方法的执行时间：" + (end - start));
        } catch (Throwable throwable) {
            // AfterThrowing通知：catch住异常
            throwable.printStackTrace();
        } finally {
            // After通知：finally
        }

        return proceed;
    }

    // 除了Around，其他的通知的返回值都写void
    public void before() {
        System.out.println("before通知");

    }

    public void after() {
        System.out.println("after通知");
    }

    public void afterReturning(Object result2) {
        System.out.println("afterReturning:" + result2);
    }

    public void afterThrowing(Exception exception) {
        System.out.println("afterThrowing:" + exception.getMessage());
    }
}
